package sing.rabbit.consumer.config;

import org.springframework.amqp.core.AcknowledgeMode;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import sing.rabbit.consumer.usage.SimpleQueueListener3;

import static sing.rabbit.common.configurations.SimpleConfiguration.SIMPLE_QUEUE_NAME;

/**
 * 简单模式 、 工作模式 区别在于消费者数量，队列数量都为 1，<br>
 * 没有指定交换机, 此时到默认交换机， routingKey 使用 queue 名 <br>
 * 在 SpringBoot 中，无需关心指定 routingKey 的事，配置好本身的配置就好，因为已经是说是 Simplexxx 了，做了区分
 *
 * @author xing
 * @date 2022/9/7 17:21
 */
@Configuration
public class SimpleListenerConfiguration {

    @Profile("sample_3")
    @Bean
    //@ConditionalOnBean({CachingConnectionFactory.class, SimpleQueueListener3.class})
    public SimpleMessageListenerContainer simpleMessageListenerContainer(CachingConnectionFactory rabbitConnectionFactory, SimpleQueueListener3 simpleQueueListener3) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        // 设置连接工厂，来源：
        // 去 Application 打印 ConnectionFacroty 类型的 BeanName，结合 RabbitAutoConfiguration，只有一个 rabbitConnectionFactory,
        // 该配置类下边 RabbitTemplate 的 Bean 声明，用的也是这个 RabbitConnectionFactory
        container.setConnectionFactory(rabbitConnectionFactory);
        // 监听的队列名，参数为 String... QueueName
        container.setQueueNames(SIMPLE_QUEUE_NAME);
        // 定义的 Listener
        container.setMessageListener(simpleQueueListener3);
        // 设置确认模式 MANUAL, AUTO, NONE
        // container.setAcknowledgeMode(AcknowledgeMode.MANUAL);
        container.setAcknowledgeMode(AcknowledgeMode.AUTO);
        // 告诉代理在单个请求中向每个使用者发送多少消息。通常可以将其设置得很高以提高吞吐量。
        // 猜测：监听者一直监听，请求一直在，意味着它代表： 本地队列的大小 或者说 本地队列中消息的数量
        container.setPrefetchCount(5);
        return container;
    }


}
